<?php


namespace app\api\controller;


use app\adminapi\controller\AuthController;
use app\exceptions\AuthException;
use OSS\OssClient;
use OSS\Core\OssException;
use think\facade\Filesystem;

class Upload extends AuthController
{

    /**
     * 图片上传，将图片上传至阿里云oss
     * @return \think\response\Json
     */
    public function upload()
    {
        $files = $_FILES['file']; // file key 值
        $name = $files['name'];
        $format = strrchr($name, '.');//截取文件后缀名如 (.jpg)
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
        $accessKeyId = Filesystem::getDiskConfig('aliyun', 'accessId');
        $accessKeySecret = Filesystem::getDiskConfig('aliyun', 'accessSecret');
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        $endpoint = Filesystem::getDiskConfig('aliyun', 'endpoint');
        // 设置存储空间名称。
        $bucket = Filesystem::getDiskConfig('aliyun', 'bucket');
        $path = 'free/' . date('Y-m-d', time()) . '/';
        $object = $path . sha1(date('YmdHis', time()) . uniqid()) . $format;;
        $filePath = $files['tmp_name'];
        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            $result = $ossClient->uploadFile($bucket, $object, $filePath);
            if (!$result) {
                return json(['errno' => 1]);
            } else {
                $data['src'] = $result['info']['url'];
                $param = [];
                $param[0]['url'] = $data['src'];
                $param[0]['alt'] = '';
                $param[0]['href'] = '';
                return json(['errno' => 0, 'data' => $param]);
            }
        } catch (OssException $e) {
            return json($e->getMessage());
        }

    }


    /**
     * 处理base64文件，将图片上传至阿里云oss
     * @param $type 文件类型
     * @param $pathc 文件地址路径
     * @return \think\response\Json
     */
    public function uploadBase64($name, $pathc)
    {

        $format = strrchr($name, '.');//截取文件后缀名如 (.jpg)
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
        $accessKeyId = Filesystem::getDiskConfig('aliyun', 'accessId');
        $accessKeySecret = Filesystem::getDiskConfig('aliyun', 'accessSecret');
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        $endpoint = Filesystem::getDiskConfig('aliyun', 'endpoint');
        // 设置存储空间名称。
        $bucket = Filesystem::getDiskConfig('aliyun', 'bucket');
        $path = 'free/' . date('Y-m-d', time()) . '/';
        $object = $path . sha1(date('YmdHis', time()) . uniqid()) . $format;;
        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            $result = $ossClient->uploadFile($bucket, $object, $pathc);
            if (!$result) {
                throw new AuthException('上传OSS错误！');
            } else {
                return  $result['info']['url'];
            }
        } catch (OssException $e) {
            throw new AuthException($e->getMessage());
        }

    }

    /**
     * 主要代码是这段方法，我这边是把图片存放在 /public/static/image/ 中 ！！！
     * 上传图片检验 - 图片上传到本地服务器
     * @param base 商品图片 - base64编码格式
     * @return \think\response\Json
     */
    public function uploadFilesImg()
    {

        $base = $this->request->param('base');
        if (!$base) throw new AuthException('缺少必要参数！');
        $base64_img = trim($base);
        $up_dir = app()->getRootPath() . './public/static/image/'; // 图片存放的位置
        // 如果文件夹不存在则创建
        if (!file_exists($up_dir)) {
            mkdir($up_dir, 0777);
        }
        // 正则表达式：判断图片文件类型是否正确
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result)) {
            $type = $result[2];
            if (in_array($type, array('pjpeg', 'jpeg', 'jpg', 'gif', 'bmp', 'png'))) {
                // 图片命名 - 格式如：20200502214128.png
                $imgName = date('YmdHis') . '.' . $type;
                $new_file = $up_dir . $imgName;
                if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_img)))) {
                    // 完整的图片地址（包括域名）
                    $goodsImgurl = $_SERVER['DOCUMENT_ROOT'] . '/static/image/' . $imgName;
                    $url = $this->uploadBase64($imgName, $goodsImgurl);
                    unlink($goodsImgurl);//删除文件
                    if ($url) {
                        return app()->make('json')->successful($url);
                    }
                    throw new AuthException('上传OSS错误');
                } else {
                    throw new AuthException('图片上传失败');
                }
            } else {
                throw new AuthException('图片类型错误');
            }
        } else {
            throw new AuthException('文件错误');
        }
    }


}